package cn.xzqwjw.taskmanager.controller.api;

import cn.xzqwjw.taskmanager.domain.pojo.Category;
import cn.xzqwjw.taskmanager.domain.vo.ResponseVo;
import cn.xzqwjw.taskmanager.service.CategoryService;
import cn.xzqwjw.taskmanager.utils.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * @author wjw
 */
@Validated
@RestController
@RequestMapping("/api/category")
public class CategoryController {

  private final CategoryService categoryService;

  @Autowired
  public CategoryController(CategoryService categoryService) {
    this.categoryService = categoryService;
  }

  /**
   * 处理 "/api/category" 的 POST 请求，添加分类
   */
  @PostMapping("")
  public String add(
      @NotNull(message = "参数不能为空")
      @Valid @RequestBody Category category) {
    return categoryService.add(category);
  }

  /**
   * 处理 "/api/category/batch" 的 POST 请求，批量添加分类
   */
  @PostMapping("/batch")
  public String addBatch(
      @NotBlank(message = "Tag 不能为空")
      @RequestParam(value = "Tag") String tag,
      @NotNull(message = "IdParent 不能为空")
      @RequestParam(value = "IdParent") int idParent,
      @NotNull(message = "内容不能为空")
      @RequestBody String rows) {
    return categoryService.addBatch(tag, idParent, rows);
  }

  /**
   * 处理 "/api/category/{id:[0-9]+}" 的 DELETE 请求，删除分类
   */
  @DeleteMapping("/{id:[0-9]+}")
  public String delById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return categoryService.delById(id);
  }

  /**
   * 处理 "/api/category/{id:[0-9]+}" 的 PUT 请求，修改分类
   */
  @PutMapping("")
  public String modifyAll(
      @NotNull(message = "参数不能为空")
      @Valid @RequestBody Category category) {
    return categoryService.modify(category);
  }

  // ==================== 查询分类 ====================

  /**
   * 根据分类id查询得到某个分类的详情
   */
  @GetMapping("/{id:[0-9]+}")
  public String queryById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return categoryService.queryById(id);
  }

  /**
   * 如果有标签，则根据标签得到所有分类列表
   * 如果无，则到所有分类列表
   */
  @GetMapping("/list-all")
  public String listAll(
      @RequestParam(value = "Tag", defaultValue = "") String tag) {
    return categoryService.listAll(tag);
  }

  /**
   * 获取某子部门的所有上级id，包括父id，爷id，用于编辑时，设置树的展开
   */
  @GetMapping("/list-all-parent-id")
  public String listAllIdParent(
      @NotNull(message = "参数不能为空")
      @RequestParam(value = "Id") int id) {
    return JsonUtil.obj2Json(ResponseVo.success(categoryService.listAllIdParent(id)));
  }

}
